package lambda;

/*
lambda语法：
    (形参列表)-> {
        //方法体
    }
 1.(形参列表)表示功能接口中，必须要重写的抽象方法的形参列表
 2.->由一个英文横岗 + 英文大于号字符组成，他是lambda表达式的运算符，
 读作：goes to
 3.{
    //方法体
    }
    表示功能接口中，必须要重写的抽象方法的方法体实现

完成lambda表达式的类型推断：
    1.直接用父接口引用接收，由于lambda表达式表示的子类对象并没有
    自己独有的成员，所以直接用父类引用接收完全不会有任何问题，
    2.不用引用接收，但是要直接告诉编译器Lambda表达式是哪个接口的子类对象，
    语法上有点像强转（但不是）
        语法：
        ((父接口的名字)Lambda表达式).方法名(实参)
        这种方式有点类似于匿名对象，所以必须直接调用方法，不然会编译语法报错。
    3.借助方法完成类型推断
        a.可以借助方法的返回值数据类型完成类型推断，因为方法的返回值
        编译器已经知道该返回什么对象
        b.可以借助方法的形参的数据类型完成类型推断，因为方法的实参
        编译器已经知道该传入什么对象



 */
public class Demo02 {
    public static void main(String[] args) {
        //使用父引用接收：
        IA1 ia1 = () -> System.out.println("无参无返回值");
        ia1.m1();

        //((父接口的名字)Lambda表达式).方法名(实参)
        ((IA1) ()-> System.out.println("有参无返回值")
        ).m1();

        //调用test1方法
        test1(new IB1() {
            @Override
            public void m1(String str) {
                System.out.println("匿名内部类重写接口中的子类方法");
            }
        });
        //lambda表达式写法：
        test1((String str) -> System.out.println("123"));

    }
    //方法需要传入一个接口类型的参数

    public static void test1(IB1 ib) {

        ib.m1("abcdef");
    }
}
@FunctionalInterface
interface IA1 {
    void m1();
}

@FunctionalInterface
interface IB1 {
    void m1(String str);
}
interface IC1 {
    int m1();
}




